package kgame5.kgu.move {
import kgame5.k3d.core.math.Vector3D;
import kgame5.k3d.core.obj3d.hardvo.HardVO;
import kgame5.kgu.move.cd.BoxBound2D;
import kgame5.kgu.move.cd.gridcd.GridCollition;

/*
 * 绕行
 */
class Detour {
	public static const  DETOUR_SPEED:int=2;
	//自动绕行,p是player,b是block
	//注意只有在四个方向的时候才绕行，因为360方向，他自己会有分速度去绕行的
	//!!自动绕行很简单，很短的代码就能解决问题
	//p是玩家，b是障碍物
	public function Process(p:HardVO ,b:HardVO ,gc:GridCollition ,bound:BoxBound2D ):void{
		//T.p("autoDetour");
		var pp:Vector3D = p.v3d_p;
		var pv :Vector3D = p.v3d_v;
		
		var bp:Vector3D  = b.v3d_p;
		
		//T.p("playerP",pp);
		//T.p("playerV",pv);
		//T.p("bar",bp);
		//T.p("barAB",b.aabb.A,b.aabb.B);
		var bA2:int=b.aabb.A>>1;
		var bB2:int=b.aabb.B>>1;
		
		var up:int=bp.z+bB2;
		var down:int=bp.z-bB2;
		var left:int=bp.x-bA2;
		var right:int=bp.x+bA2;
		//T.p(up,down,left,right);
		
		var pA2:int  = p.aabb.A>>1;
		var pB2:int  = p.aabb.B>>1;
		var myLeft:int=pp.x-pA2;
		var myRight:int=pp.x+pA2;
		var myUp:int=pp.z+pB2;
		var myDown:int=pp.z-pB2;
		
		if(pv.x==0){//上下方向
			
			if(myLeft<left&&myRight>right){//障碍物比我小，且被我包围，我无法绕行
				return;
			}
			
			if((pv.z>0&&bp.z>pp.z)//---------------向上走且障碍物在玩家之上
			||(pv.z<0&&bp.z<pp.z)//---------------向下走且障碍物在玩家之下
			){
				
					if(myLeft<left){//可向左绕行一下
						pv.x=-DETOUR_SPEED;//设置速度
						pv.z=0;
						//尝试加到指定位置，有碰撞则返回即可
						testPlace(p,gc,bound);
					}else if(myRight>right){//可向右绕行一下
						pv.x=DETOUR_SPEED;//设置速度
						pv.z=0;
						//尝试加到指定位置，有碰撞则返回即可
						testPlace(p,gc,bound);
					}
				
				
			}
		}else if(pv.z==0){//左右方向
		
			if(myUp>up&&myDown<down){//障碍物比我小，且被我包围，我无法绕行
				return;
			}
		
			if((pv.x>0&&bp.x>pp.x)//---------------向上走且障碍物在玩家之上
			||(pv.x<0&&bp.x<pp.x)//---------------向下走且障碍物在玩家之下
			){
				
					if(myUp>up){//可向上绕行一下
						pv.z=DETOUR_SPEED;//设置速度
						pv.x=0;
						//尝试加到指定位置，有碰撞则返回即可
						testPlace(p,gc,bound);
					}else if(myDown<down){//可向下绕行一下
						pv.z=-DETOUR_SPEED;//设置速度
						pv.x=0;
						//尝试加到指定位置，有碰撞则返回即可
						testPlace(p,gc,bound);
					}
				
				
			}
		}
	}
	
	//测试把东西放下
	private function testPlace(hardVO:HardVO ,gc:GridCollition ,bound:BoxBound2D ):void{
		var p:Vector3D = hardVO.v3d_p;
		var v :Vector3D = hardVO.v3d_v;
		
		var _preP:Vector3D = hardVO._preP;
		
		_preP.copy(p);//保持原始位置
		
		p.add(v);//加到指定位置
		
		//超出了边界
		if(bound.contains(hardVO)==false||gc.FastCD(hardVO)){
			//则放回原来位置
			p.copy(_preP);
			//速度为0，不再移动,!!严重注意这个，否则会出现客户端服务器不同步的东西，坦克绕行混乱
			v.x=0;
			v.z=0;
		}
	}
}
}
